package bitclub;

import herramientas.BitUtil;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TreeSet;
import javax.management.timer.Timer;

import persistencia.POfertaNumeroArticulo;

/**
 * @author BIT COMPANY
 */
public class OfertaNumeroArticulo extends Oferta { //hereda de clase Oferta

    private int numAlquiladas, numPagar;

    public OfertaNumeroArticulo(double descuento, double precioNuevo, int diasExtras, int tipo, Date fechaFin, Date fechaInicio, String nombre, int id, int numAlquiladas, int numPagar) {
        super(descuento, precioNuevo, diasExtras, tipo, fechaFin, fechaInicio, nombre, id);
        this.numAlquiladas = numAlquiladas;
        this.numPagar = numPagar;
    }

    public OfertaNumeroArticulo(double descuento, double precioNuevo, int diasExtras, int tipo, Date fechaFin, Date fechaInicio, String nombre, int numAlquiladas, int numPagar) {
        super(descuento, precioNuevo, diasExtras, tipo, fechaFin, fechaInicio, nombre);
        this.numAlquiladas = numAlquiladas;
        this.numPagar = numPagar;
    }

    public int getNumAlquiladas() {
        return numAlquiladas;
    }

    public void setNumAlquiladas(int numAlquiladas) {
        this.numAlquiladas = numAlquiladas;
    }

    public int getNumPagar() {
        return numPagar;
    }

    public void setNumPagar(int numPagar) {
        this.numPagar = numPagar;
    }

    @Override
    public String toString() {
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        if (this.getTipo() == 1) {
            return "Nombre Oferta: " + this.getNombre() + ""
                    + "\nOferta número de películas (" + this.getNumAlquiladas() + ")"
                    + "\nPorcentaje de descuento: " + this.getDescuento() + "%"
                    + "\nComprendido entra las fechas: " + df.format(this.getFechaInicio()) + ""
                    + " y " + df.format(this.getFechaFin());
        } else if (this.getTipo() == 2) {
            return "Nombre Oferta: " + this.getNombre() + ""
                    + "\nOferta número de películas (" + this.getNumAlquiladas() + ")"
                    + "\nDías extras para entregar: " + this.getDiasExtras() + ""
                    + "\nComprendido entra las fechas: " + df.format(this.getFechaInicio()) + ""
                    + " y " + df.format(this.getFechaFin());
        } else if (this.getTipo() == 3) {
            return "Nombre Oferta: " + this.getNombre() + ""
                    + "\nOferta número de películas (" + this.getNumAlquiladas() + ")"
                    + "\nPrecio nuevo de alquiler: " + this.getPrecioNuevo()
                    + "\nComprendido entra las fechas: " + df.format(this.getFechaInicio()) + ""
                    + " y " + df.format(this.getFechaFin());
        } else {
            return "Nombre Oferta: " + this.getNombre() + ""
                    + "\nOferta número de películas (" + this.getNumAlquiladas() + "x" + this.getNumPagar() + ")"
                    + "\nComprendido entra las fechas: " + df.format(this.getFechaInicio()) + ""
                    + " y " + df.format(this.getFechaFin());
        }
    }

    public static List<OfertaNumeroArticulo> seleccionarOferta(Date fechaBusqueda, String tipo) {

        List<OfertaNumeroArticulo> o = new ArrayList();

        o = POfertaNumeroArticulo.seleccionarOfertaBD(fechaBusqueda, tipo);

        return o;
    }

    public void nuevo(OfertaNumeroArticulo o) {
        POfertaNumeroArticulo.nuevoBD(o);
    }

    public void actualizar(OfertaNumeroArticulo o) {
        POfertaNumeroArticulo.actualizarBD(o);
    }

    public void eliminar(OfertaNumeroArticulo o) {
        POfertaNumeroArticulo.eliminarBD(o);
    }

    public static void comprobarOferta(TreeSet<ArticuloAlquilado> listArticuloAlquilado) {
        List<OfertaNumeroArticulo> listOfertas;
        List<OfertaNumeroArticulo> listOfertasAplicadas =new ArrayList();

        Date fechaBusqueda = new Date();
        Date fechaEntrega;

        int ofertasAplicadas = 0;
        int numPagar = 0;
        int tipo = 0;
        int diasExtras = 0;
        double precioNuevo = 0;

        listOfertas = seleccionarOferta(fechaBusqueda, "Actuales"); //devuelve ofertas actuales

        if (!listOfertas.isEmpty()){ //hay ofertas y hay q modificar la lista de articulos alquilados

            for (OfertaNumeroArticulo o : listOfertas) { //recorremos la lista de ofertas
                if (listArticuloAlquilado.size() == o.getNumAlquiladas()) { //vemos si la oferta coincide con el num de articulos alquilados, sino termina y devuelve lista
                    ofertasAplicadas++;
                    listOfertasAplicadas.add(o);
                    tipo = o.getTipo();
                    boolean salir = false;
                    for (ArticuloAlquilado aa : listArticuloAlquilado) { //recorremos lista de articulos alquilados
                        if (tipo == 1) { //si es de tipo uno se cambia el precio aplicando porcentaje
                            precioNuevo = aa.getArticulo().getTarifa().getPrecio() * (o.getDescuento() / 100);
                            precioNuevo = aa.getArticulo().getTarifa().getPrecio() - precioNuevo;
                            aa.setPrecioAlquiler(precioNuevo);
                        } else if (tipo == 2) { //si es de tipo dos se cambia el dia de entrega
                            diasExtras = o.getDiasExtras();
                            fechaEntrega = new Date(fechaBusqueda.getTime() + Timer.ONE_DAY * diasExtras);
                            aa.setFechaEntrega(fechaEntrega);
                        } else if (tipo == 3) { //si es de tipo 3 se cambia el precio total del alquiler
                            aa.setPrecioAlquiler(o.getPrecioNuevo() / listArticuloAlquilado.size());//divide el nuevo importe q se le va a poner al alquiler de 4 peliculas entre esas 4 peliculas para q al final se sume todos los articulos y de el precio nueevo q se habia puesto en la oferta
                        } else { //si es de tipo 4 se cogen las peliculas mas caras para aplicar el 3x2
                            if (!salir) { //solo entra la primera vez para coger el valor de las pelis a contabilizar
                                numPagar = o.getNumPagar();
                                salir = true;
                            } //posteriormente las va restando para una vez que llegue a 0 esas pelis no cobrarlas
                            if (numPagar > 0) {
                                numPagar--;
                            } else {
                                aa.setPrecioAlquiler(0);
                            }
                        }
                    }
                }
            }
        }
        System.out.println(BitUtil.muestraSubrayado("Se han aplicado " + ofertasAplicadas + " ofertas por numero de articulo", "-"));
        for (OfertaNumeroArticulo o : listOfertasAplicadas){
            System.out.println("\n"+o.toString()+"\n");
        }
    }
}
